/*
*********************************************************************************************************
*
*                                           wdg.c
*
* 文件名称 : wdg.c
* 文件版本 : V0.01
* 文件描述 : 看门狗运用
* 编写人员 : HHL
* 修改人员 :
* 编修描述 : V0.01，时间2015.09.15
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*                                           头文件描述
*********************************************************************************************************
*/
#include "stm32f4xx_iwdg.h"
#include "stm32f4xx_wwdg.h"



/*
*********************************************************************************************************
*                                           预处理描述
*********************************************************************************************************
*/








/*
*********************************************************************************************************
*                                             静态函数
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*
*                                           iwdgSet
*                                       独立看门狗初始化
*
* 函数名称 : iwdgSet()
* 函数版本 : V.001
* 功能描述 :
*           :分频系数prer，0-7，重载值，rlr,0-0xfff
*           :分频因子 = 4*2^prer，最大256
*           :复位时间，大概是 ((4*2^prer)*rlr)/32,时间单位ms
*           :例如1ms复位    prer=0，rlr = 8
* 编写人员 : HHL
* 修改人员 :
* 编修描述 : V.001，时间2015.09.15
*********************************************************************************************************
*/
void iwdgSet(uint8_t prer, uint16_t rlr)
{
	//取消看门狗写保护
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
	//分频系数
	IWDG_SetPrescaler(prer);
	//转载值
	IWDG_SetReload(rlr);
	//重载一次，也是喂狗的命令
	IWDG_ReloadCounter();
	//启动iwdg
	IWDG_Enable();
}

/*
*********************************************************************************************************
*
*                                           iwdgFeed
*                                            喂狗
*
* 函数名称 : iwdgFeed()
* 函数版本 : V.001
* 功能描述 :
* 编写人员 : HHL
* 修改人员 :
* 编修描述 : V.001，时间2015.09.15
*********************************************************************************************************
*/
void iwdgFeed(void)
{
	IWDG_ReloadCounter();
}


/*
*********************************************************************************************************
*
*                                              _pow_
*                                               x^y
*
* 函数名称 : _pow_()
* 函数版本 : V.001
* 功能描述 :
* 编写人员 : HHL
* 修改人员 :
* 编修描述 : V.001，时间2015.09.15
*********************************************************************************************************
*/
uint32_t _pow_ (uint32_t x, uint32_t y)
{
	volatile uint32_t r = 1;

	if(0 == y)  {
    return(r);
  } else {
		for(uint32_t i =0; i<y; i++) {
			r *= x;
		}
		return(r);
	}
}


/*
*********************************************************************************************************
*
*                                           restartSys
*                                            重启系统
*
* 函数名称 : restartSys()
* 函数版本 : V.001
* 功能描述 : 重启系统,输入重启时间，毫秒,不能超过16380，超出自动裁剪到16380
* 编写人员 : HHL
* 修改人员 :
* 编修描述 : V.001，时间2015.09.15
*********************************************************************************************************
*/

void restartSys(uint16_t delayTime)
{
	//输入参数不能大于16380
	if(delayTime > 16380) {
		iwdgSet(7, 4095);
	} else {
		uint32_t _x = (32*(delayTime));
		uint32_t tmp = _x/8;

		if(tmp <= 0xfff) {
			iwdgSet(0, tmp);
		} else {
			for(uint32_t i=1; i<8; i++) {
				tmp = (_x/(8*(_pow_(i,2))));
				if(tmp <= 0xfff) {
					iwdgSet(i, tmp);
				}
			}
		}
	}
}
